<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
</head>
<style type="text/css">

</style>

<body>

    <script type="text/javascript">
        //函数柯里化 js原生实现一个方法 add(1)(2)(3)
        //闭包实现 闭包:函数嵌套函数,内部函数可以访问外部函数的变量,外部函数不能访问内部函数的变量
        // function show(a) {
        //     let c = 10
        //     return function (b) {   //闭包
        //         return a + b + c;
        //     }

        // }
        // show(1)(2)
        // console.log(show(1)(2)) //13

        // 方法1：多次调用,每次调用都返回一个函数,直到参数全部接收完毕,才会返回最终结果。多层闭包
 /*        function add(a) {
            console.log(1);
            return function (b) {
                console.log(2);
                return function (c) {
                    console.log(3);
                    return a + b + c;
                }
            }
        }
        console.log(add(1)(2)(3)) //6  */

        //实现1
     /*     function add(x) {
               return function (y) {
                   if (typeof y !== 'undefined') {
                       x += y;
                       console.log('返回匿名函数名', arguments.callee);
                       return arguments.callee; //此处arguments.callee代表函数名，多用于递归调用，防止函数执行与函数名紧紧耦合的现象，对于没有函数名的匿名函数也非常起作用
                   } else {
                       return x;
                   }
               };
           }
           console.log(add(1)(2)(3)())  */

        //实现2
       /*     function add(a) {
               function sum(b) { // 使用闭包
                   a += b; // 累加
                   return sum;
               }
               sum.toString = function () { // 重写toSting() 方法.返回一个表示该对象的字符串，当对象表示为文本值或以期望的字符串方式被引用时，toString方法被自动调用.相当于递归了
                   return a;
               }
               return sum; // 返回一个函数
           }
           alert(add(1)(2)(3)) // 6  */

    //总结:函数柯里化与高阶函数区别?    1.函数柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式 2.高阶函数:A函数接收的参数或者返回值是一个函数,则A为高阶函数 。比如定时器,promise,es5数组方法forEach,map等都是高阶函数 

    </script>

</body>

</html>